// Foundation for Sites by ZURB
// foundation.zurb.com
// Licensed under MIT Open Source

////
/// @group functions
////

/// 计算两个整数的最大公约数
///
/// @param {Number} $a - 第一个整数
/// @param {Number} $b - 第二个整数
///
/// @returns {Number} 最大公约数
@function gcd($a, $b) {
  // From: http://rosettacode.org/wiki/Greatest_common_divisor#JavaScript
  @if ($b != 0) {
    @return gcd($b, $a % $b);
  } @else {
    @return abs($a);
  }
}

/// 处理十进制指数时，尝试将它们转换为分数，然后对部分计算使用 n 次方根算法
///
/// @param {Number} $base - 基数
/// @param {Number} $exponent - 指数
/// @param {Number} $prec - 精度
///
/// @returns {Number} 幂的乘积
@function pow($base, $exponent, $prec: 16) {
  // 如果指数不是整数
  @if (floor($exponent) != $exponent) {
    $prec2: pow(10, $prec);
    $exponent: round($exponent * $prec2);
    $denominator: gcd($exponent, $prec2); // 分母
    @return nth-root(pow($base, $exponent / $denominator), $prec2 / $denominator, $prec);
  }

  $value: $base;
  @if $exponent > 1 {
    @for $i from 2 through $exponent {
      $value: $value * $base;
    }
  } @else if $exponent < 1 {
    @for $i from 0 through -$exponent {
      $value: $value / $base;
    }
  }

  @return $value;
}

/// 求一个数的 n 次方根
///
/// @param {Number} $num - 数字
/// @param {Number} $n - n 次方根
/// @param {Number} $prec - 精度
///
/// @returns {Number} 结果值
@function nth-root($num, $n: 2, $prec: 12) {
  // From: http://rosettacode.org/wiki/Nth_root#JavaScript
  $x: 1;

  @for $i from 0 through $prec {
    $x: 1 / $n * (($n - 1) * $x + ($num / pow($x, $n - 1)));
  }

  @return $x;
}

/// 计算高度作为一个给定比例的宽度的百分比。
/// @param {List} $ratio - 用于计算高度的比率，格式为 `x by y`.
/// @return {Number} 高度相对于响应容器宽度的百分比值
@function ratio-to-percentage($ratio) {
  $w: nth($ratio, 1);
  $h: nth($ratio, 3);
  @return $h / $w * 100%;
}
